#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// int main(){
//   int arr[10]={1,2,3,4,5,6,7,8,9,10};
//   int (*p)[10]=&arr;
//   int i=0;
//   for(i=0;i<10;i++){
//     printf("%d ",(*p)[i]);   /*多此一举*/
//   }
//   return 0;
// }

// void Print(int (*arr)[5], int r, int c) {
//     int i = 0;
//     for (i = 0; i < r; i++) {
//         int j = 0;
//         for (j = 0; j < c; j++) {
//             printf("%d ", *(*(arr + i) + j));/* *(arr+i)==arr[i] arr[i]表示&arr[i][0] */
//         }
//         printf("\n");
//     }
// }

// int main() {
//     int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//     /*二维数组数组名同样是数组首元素的地址*/
//     /*二维数组可以理解为一维数组的数组--即首地址为第一行arr[0]*/
//     Print(arr, 3, 5);
//     return 0;
// }

// int Add(int x,int y){
//   return x+y;
// }
// int main(){
//   // int a=10;
//   // int* pa=&a;

//   // int arr[5]={0};
//   // int (*parr)[5]=&arr;
//   // printf("%p\n",&Add);       /* 函数名和&函数名都表示函数的地址，没有区别 */
//   // printf("%p\n",Add);
//   int (*pf)(int,int)=&Add;      /*函数指针类型：int(*)(int,int)*/
//   int ret=(*pf)(4,5);
//   int ret1=pf(4,5);             /* pf是函数指针，pf()等价于(*pf)()*/
//   printf("%d\n",ret);
//   printf("%d\n",ret1);
//   return 0;
// }

// int main(){
//   (*(void(*)())0)();   /* 强制将0的类型转换为函数指针类型--0表示函数的地址 */
//   return 0;
// }

// int main(){
//      void    (*signal(int, void(*)(int)))(int);       /*该段代码是声明signal函数,且该函数同样是函数指针，类型为void(*)(int)*/
//   /*返回类型*//*函数名*//*    函数参数    *//*返回类型*/   /*signal函数参数为int和函数指针void(*)(int)*/
//                    /*整型*//*函数指针类型*/             /* 返回类型为void,指向的函数参数是int */
//   return 0;
// }

// typedef unsigned int uint; /*可以对类型进行重命名*/

// int main(){
//     unsigned int num1;
//     uint num2;           /*二者等价*/
//     return 0;
// }

// typedef int* pint_t;
// int main(){
//     int* p;
//     pint_t p2;
//     return 0;
// }

//         /* 重命名放在*后 */
// typedef int(*parr_t)[6];
// int main(){
//     int arr[6]={0};
//     int (*p)[6]=&arr;  /*p是数组指针变量*/
//     parr_t p2=&arr;    /*二者等价*/
//     return 0;
// }

// int Add(int x,int y){
//   return x+y;
// }
//         /* 重命名放在*后 */
// typedef int(*pf_t)(int,int);  /* pf_t是函数指针类型 */

// int main(){
//     int (*pf)(int,int)=Add;
//     pf_t pf2=Add;           /*二者等价*/
//     return 0;
// }

// typedef void(*pf_t)(int);
// int main(){
//      void    (*signal(int, void(*)(int)))(int);       /*该段代码是声明signal函数,且该函数同样是函数指针，类型为void(*)(int)*/
//   /*返回类型*//*函数名*//*    函数参数    *//*返回类型*/   /*signal函数参数为int和函数指针void(*)(int)*/
//                    /*整型*//*函数指针类型*/             /* 返回类型为void,指向的函数参数是int */
//     /*简化后*/
//     pf_t signal(int,pf_t);
//     return 0;
//  }